// @algorithm @lc id=6 lang=cpp
// @title zigzag-conversion

#include <iostream>
#include <vector>
#include <string>
#include "algm/algm.h"
using namespace std;
// @test("PAYPALISHIRING",3)="PAHNAPLSIIGYIR"
// @test("PAYPALISHIRING",4)="PINALSIGYAHRPI"
// @test("A",1)="A"

/**
 * @brief
 * 找到每行每个字符下标的表达式即可
 */
class Solution {
public:
    string convert(string s, int numRows)
    {
        string res;
        int    len = s.size();
        for (int i = 0; i < numRows && i < len; i++) {
            if (i == 0 || i == numRows - 1) {
                for (int j = i; j < len;) {
                    res.push_back(s[j]);
                    if (numRows > 1) //防止numRows=1时无限循环.
                        j += (numRows - 1) * 2;
                    else
                        j++;
                }
            } else {
                int j = i;
                res.push_back(s[j]);
                while (true) {
                    if (j + (numRows - i - 1) * 2 < len) {
                        j += (numRows - i - 1) * 2;
                        res.push_back(s[j]);
                    } else {
                        break;
                    }
                    if (j + (i * 2) < len) {
                        j += (i * 2);
                        res.push_back(s[j]);
                    } else {
                        break;
                    }
                }
            }
        }
        return res;
    }
};